排序二叉树的中序遍历
Problem Description
在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值。现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序遍历的结果。
Input。
第一行包含一个整数n,为关键值的个数,关键值用整数表示。(n<=1000)
第二行包含n个整数,保证每个整数在int范围之内。
Output
为给定的数据建立排序二叉树,并输出其中序遍历结果,每个输出占一行。
Example Input
1 2
//错误代码:Time limit exceeded BiTree CreatBiTree(BiTree r,int m) { BiTree p,q,w; p = (BiTree)malloc(sizeof(BiTNode)); p->rchild = NULL; p->lchild = NULL; p->data = m; q = r; while(q) { if(m>q->data) { w = q; q = q->rchild; } if(m<q->data) //1:系统不运行:这个地方没加else,我以为只要在while里循环就行了,当q为空,直接跳出, { w = q; //巨巨找出错误,如果上一个if执行了,q变为空,么下一个ifm无法与q->data比较,所以错误 q = q->lchild; //2:只判断了大于小于,没判读等于,如果为等于号,那么一直在while里循环,所以造成time limit } } if(m>w->data) w->rchild = p; else w->lchild = p; return r; } /* Time limit 出现的原因: 很多时候我们看到Time Limit Exceeded马上会想到一定是算法太慢,不符合要求,其实往往还可能遇到一种情况是没有判断输入结束,不然 系统一直在那等你的输出结果,发现你一直不输出,或者程序一直不退出,所以给Time Limit Exceeded。 */ //下面是完整的代码: #include <stdio.h> #include <stdlib.h> #define maxsize 10001 int j; typedef struct BiTNode { int data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; BiTree CreatBiTree(BiTree r,int m) { BiTree p,q,w; p = (BiTree)malloc(sizeof(BiTNode)); p->rchild = NULL; p->lchild = NULL; p->data = m; q = r; while(q) { if(m>q->data) { w = q; q = q->rchild; } else if(m<=q->data) //加了一个else,一个等于号 { w = q; q = q->lchild; } } if(m>w->data) w->rchild = p; else w->lchild = p; return r; } BiTree InitBiTree() //初始化头结点 { BiTree root; root = (BiTree)malloc(sizeof(BiTNode)); root->lchild = NULL; root->rchild = NULL; return root; } void midPrint(BiTree root)//中序输出 { if(root) { midPrint(root->lchild); if(j==1) { j++;printf("%d",root->data); } else printf(" %d",root->data); midPrint(root->rchild); } } int main() { int m; scanf("%d",&m); BiTree root; int a[maxsize],i; j = 1; root = InitBiTree(); scanf("%d",&root->data); for(i = 1;i<=m-1;i++) { scanf("%d",&a[i]); CreatBiTree(root,a[i]); } midPrint(root); printf("\n"); return 0; }